home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / info-service / gopher / Rice_CMS / gopher24 / gopclifv.$rexx < prev    next >
Encoding:
Text File  |  1993-01-25  |  45.6 KB  |  577 lines

  1. /*                                                                      00010000
  2.  *        Name: GOPCLIFV REXX                                           00020000
  3.  *              VM TCP/IP Network GOPHER Client file viewer             00030000
  4.  *      Author: Rick Troth, Rice University, Information Systems        00040000
  5.  *        Date: 1992-Dec-23                                             00050000
  6.  *                                                                      00060000
  7.  *       Input: a plain-text file to view                               00070000
  8.  *      Output: zero or more information or error messages              00080000
  9.  */                                                                     00090000
  10.                                                                         00100000
  11. /*                                                                      00110000
  12.  *      Copyright 1992 Richard M. Troth.   This software was developed  00120000
  13.  *      with resources provided by Rice University and is intended      00130000
  14.  *      to serve Rice's user community.   Rice has benefitted greatly   00140000
  15.  *      from the free distribution of software,  therefore distribution 00150000
  16.  *      of unmodified copies of this material is not restricted.        00160000
  17.  *      You may change your own copy as needed.   Neither Rice          00170000
  18.  *      University nor any of its employees or students shall be held   00180000
  19.  *      liable for damages resulting from the use of this software.     00190000
  20.  */                                                                     00200000
  21.                                                                         00210000
  22. Trace "OFF"                                                             00220000
  23.                                                                         00230000
  24. Parse Arg args '(' . ')' .                                              00240000
  25.                                                                         00250000
  26. /*  verify availability of input  */                                    00260000
  27. 'PEEKTO'                                                                00270000
  28. If rc ^= 0 & rc ^= 12 Then Exit rc                                      00280000
  29. If rc = 12 Then Do  /*  Warning: file is empty  */                      00290000
  30.     'CALLPIPE COMMAND XMITMSG 559 (ERRMSG | *:'                         00300000
  31.     Exit                                                                00310000
  32.     End  /*  If  ..  Do  */                                             00320000
  33.                                                                         00330000
  34. Address "COMMAND" 'GLOBALV SELECT GOPHER GET' ,                         00340000
  35.         'GOPHER PROGID VIEWER ITEM'                                     00350000
  36. quit = 0                                                                00360000
  37.                                                                         00370000
  38. Parse Var item name '05'x path '05'x host '05'x port '05'x xtra         00380000
  39. Parse Var name 1 . 2 name       /*  discard type indicator byte  */     00390000
  40. Parse Var path 1 . 2 path       /*  discard type indicarot byte  */     00400000
  41. If name = "" Then name = args                                           00410000
  42.                                                                         00420000
  43. /*  fetch fs. stem variable from GlobalVs  */                           00430000
  44. 'CALLPIPE COMMAND GLOBALV SELECT GOPHER LIST | DROP' ,                  00440000
  45.         '| LOCATE 1-4 / FS./ | SPEC /=/ 1 2-* NEXT | VARLOAD'           00450000
  46. If rc ^= 0 Then Address "COMMAND" 'EXEC GOPCLINI'                       00460000
  47. If ^Datatype(fs.tube,'X') Then fs.tube = ""                             00470000
  48.                                                                         00480000
  49. message.0 = 0                                                           00490000
  50. command = ""                                                            00500000
  51.                                                                         00510000
  52. Select  /*  viewer  */                                                  00520000
  53.     When viewer = ""         Then Call BUILT_IN                         00530000
  54.     When viewer = "XEDIT"    Then Call XEDIT                            00540000
  55.     When viewer = "BROWSE"   Then Call BROWSE                           00550000
  56.     Otherwise                     Call ANYOTHER                         00560000
  57.     /*                                                                  00570000
  58.         handle disk-full conditions!                                    00580000
  59.      */                                                                 00590000
  60.     End  /*  Select  viewer  */                                         00600000
  61. vrc = rc                                                                00610000
  62.                                                                         00620000
  63. 'CALLPIPE STEM MESSAGE. | *:'                                           00630000
  64.                                                                         00640000
  65. Parse Upper Var command cmdverb .                                       00650000
  66. Address "COMMAND" 'GLOBALV SELECT GOPHER PUT' ,                         00660000
  67.         'COMMAND CMDVERB'                                               00670000
  68.                                                                         00680000
  69. Exit vrc                                                                00690000
  70.                                                                         00700000
  71.                                                                         00710000
  72. /* ============================================================ BUILT_IN00720000
  73.  */                                                                     00730000
  74. BUILT_IN:                                                               00740000
  75.                                                                         00750000
  76. /*  read the file from the preceding stage  */                          00760000
  77. 'CALLPIPE *: | EXPAND | XLATE OUTPUT | XLATE *-* 00-3F 40 FF 40' ,      00770000
  78.         '| DEBLOCK FIXED' fs.scrcols + 1 '| STEM FILE.'                 00780000
  79.                                                                         00790000
  80. /*  display the file and process user's response  */                    00800000
  81. row = 3;        col = 0                                                 00810000
  82. ki = file.0;    kl = fs.scrrows - 5;    ko = 1                          00820000
  83. needle = ""     /*  may be re-used within this context  */              00830000
  84.                                                                         00840000
  85. 'CALLPIPE COMMAND XMITMSG 614 (APPLID GOP' ,                            00850000
  86.         'NOCOMP NOHEADER | STEM HELP.'                                  00860000
  87.                                                                         00870000
  88. 'CALLPIPE COMMAND XMITMSG 5 (APPLID GOP NOHEADER | VAR MORE'            00880000
  89.                                                                         00890000
  90. Do Forever                                                              00900000
  91.                                                                         00910000
  92.     /*  write the program title line  */                                00920000
  93.     wscreen = sba(0,-1) || field("BLUE","PROT") || sba(0,0) || progid , 00930000
  94.                         || sba(0,fs.scrcols-Length(host)-1) || host     00940000
  95.                                                                         00950000
  96.     /*  no SBA for status because it follows host immediately  */       00960000
  97.     If message.0 < 1 Then Do                                            00970000
  98.     wscreen = wscreen   || field("PROT") || Left(ko || '/' || ki, 11)   00980000
  99.     If ko + kl <= ki Then                                               00990000
  100.     wscreen = wscreen   || field("WHITE","HIGH","PROT") || more         01000000
  101.         End  /*  If  ..  Do  */                                         01010000
  102.                                                                         01020000
  103.     /*  don't write status or name if they'll be overlaid  */           01030000
  104.     If message.0 < 2 Then                                               01040000
  105.     wscreen = wscreen   || sba(2,(fs.scrcols-Length(name))/2) ,         01050000
  106.                         || field("WHITE","PROT") || name                01060000
  107.                                                                         01070000
  108.     /*  write as many message lines as needed  */                       01080000
  109.     If message.0 > 0 Then Do                                            01090000
  110.         Do i = 1 to message.0                                           01100000
  111.             wscreen = wscreen || sba(i,-1) ,                            01110000
  112.                 || field("RED","HIGH","PROT") || message.i              01120000
  113.             End  /*  Do  For  */                                        01130000
  114.         message.0 = 0                                                   01140000
  115.         End  /*  If  ..  Do  */                                         01150000
  116.     /*  we should probably limit that count  */                         01160000
  117.                                                                         01170000
  118.     /*  write those PFkey settings  */                                  01180000
  119.     wscreen = wscreen   || sba(fs.scrrows-2,-1) ,                       01190000
  120.                         || field("BLUE","PROT") ,                       01200000
  121.                         || help.1 ,                                     01210000
  122.                         || sba(fs.scrrows-1,-1) ,                       01220000
  123.                         || field("BLUE","PROT") ,                       01230000
  124.                         || help.2                                       01240000
  125.                                                                         01250000
  126.     i = 1; j = ko                                                       01260000
  127.     Do While i <= kl & j <= ki                                          01270000
  128.                                                                         01280000
  129. /*      'CALLPIPE VAR FILE.' || i '| XLATE OUTPUT' ,                    01290000
  130.             '| XLATE *-* 00-3F 40 FF 40 | VAR _LINE'                  */01300000
  131.                                                                         01310000
  132.         wscreen = wscreen || sba(i+2,-1) || field("GREEN","PROT")       01320000
  133.         wscreen = wscreen || file.j                                     01330000
  134.         i = i + 1;  j = j + 1                                           01340000
  135.         End                                                             01350000
  136.                                                                         01360000
  137.     rscreen = write_read(wscreen || sba(row,col) || '13'x)              01370000
  138.     Parse Var rscreen 1 aid 2 offset . '11'x rscreen                    01380000
  139.     offset = fix(offset)                                                01390000
  140.     row = offset % fs.scrcols; col = offset // fs.scrcols               01400000
  141.                                                                         01410000
  142.     /*  keep the  row/col  values within bounds  */                     01420000
  143.     row = 3     /* just reset it */                                     01430000
  144.     col = 0     /* just reset it */                                     01440000
  145.                                                                         01450000
  146.     Select /* aid */                                                    01460000
  147.         When  aid = '7D'x   /* enter */ Then nop                        01470000
  148.         When  aid = 'F2'x   /*  PF2  */ | ,                             01480000
  149.               aid = 'C2'x   /*  PF14 */ | ,                             01490000
  150.               aid = '7B'x   /*  PF11 */ | ,                             01500000
  151.               aid = '4B'x   /*  PF23 */ Then Call SUBXEDIT              01510000
  152.         When  aid = 'F3'x   /*  PF3  */ | ,                             01520000
  153.               aid = 'C3'x   /*  PF15 */ Then Leave                      01530000
  154.         When  aid = 'F4'x   /*  PF4  */ | ,                             01540000
  155.               aid = 'C4'x   /*  PF16 */ Then Call PRINT                 01550000
  156.         When  aid = 'F5'x   /*  PF5  */ | ,                             01560000
  157.               aid = 'C5'x   /*  PF17 */ Then Call SAVE                  01570000
  158.         When  aid = 'F6'x   /*  PF6  */ | ,                             01580000
  159.               aid = 'C6'x   /*  PF18 */ Then Call FIND                  01590000
  160.         When  aid = 'F7'x   /*  PF7  */ | ,                             01600000
  161.               aid = 'C7'x   /*  PF19 */ Then ko = Max(ko-kl+1,1)        01610000
  162.         When  aid = 'F8'x   /*  PF8  */ | ,                             01620000
  163.               aid = 'C8'x   /*  PF20 */ Then ko = Min(ko+kl-1,ki)       01630000
  164.         When  aid = 'F9'x   /*  PF9  */ | ,                             01640000
  165.               aid = 'C9'x   /*  PF21 */ Then  Call  MARK                01650000
  166.         When  aid = '7A'x   /*  PF10 */ | ,                             01660000
  167.               aid = '4A'x   /*  PF22 */ Then  Call  BOOKLIST            01670000
  168.         When  aid = '6D'x   /* clear */ | ,                             01680000
  169.               aid = '6E'x   /*  PA2  */ Then Do                         01690000
  170.             row = 3; col = 0; ko = 1                                    01700000
  171.             End  /*  When ..  Do  */                                    01710000
  172.         When  aid = '7C'x   /*  PF12 */ | ,                             01720000
  173.               aid = '4C'x   /*  PF24 */ | ,                             01730000
  174.               aid = 'F0'x   /* sysrq */ | ,                             01740000
  175.               aid = '6C'x   /*  PA1  */ Then  quit = 1                  01750000
  176.         When  aid = 'F1'x   /*  PF1  */ | ,                             01760000
  177.               aid = 'C1'x   /*  PF13 */ Then  Call  HELP                01770000
  178.         When  aid = '00'x               Then Do                         01780000
  179.             /*  I/O error on screen  */                                 01790000
  180.             'CALLPIPE COMMAND XMITMSG 925 (APPLID GOP' ,                01800000
  181.                     'CALLER FVW ERRMSG | STEM MESSAGE. APPEND'          01810000
  182.               Leave                                                     01820000
  183.               End                                                       01830000
  184.         Otherwise  Do   /*  Undefined PFkey/PAkey  */                   01840000
  185.             'CALLPIPE COMMAND XMITMSG 657 "' || c2x(aid) || '"' ,       01850000
  186.                 '(APPLID GOP CALLER FVW ERRMSG | STEM MESSAGE. APPEND'  01860000
  187.             End  /*  Otherwise  Do  */                                  01870000
  188.         End  /*  Select  aid  */                                        01880000
  189.                                                                         01890000
  190.     If quit Then Leave                                                  01900000
  191.                                                                         01910000
  192.     End  /*  Do  Forever  */                                            01920000
  193.                                                                         01930000
  194. If quit Then command = "QUIT"                                           01940000
  195.                                                                         01950000
  196. Return                                                                  01960000
  197.                                                                         01970000
  198.                                                                         01980000
  199.                                                                         01990000
  200. /* =============================================================== XEDIT02000000
  201.  *  Take the "file" from the input stream and pass it to CMS XEDIT.     02010000
  202.  */                                                                     02020000
  203. XEDIT:                                                                  02030000
  204.                                                                         02040000
  205. If fs.tube ^= "" Then Do                                                02050000
  206.     /*  "Can't run XEDIT on this terminal."  */                         02060000
  207.     'CALLPIPE COMMAND XMITMSG 512 "XEDIT"' ,                            02070000
  208.             '(APPLID GOP CALLER FVW ERRMSG | STEM MESSAGE. APPEND'      02080000
  209.     Return                                                              02090000
  210.     End /* If .. Do */                                                  02100000
  211.                                                                         02110000
  212. /*  stash this in a temporary file  */                                  02120000
  213. 'CALLPIPE *: | > VMGOPHER DOCUMENT A3'                                  02130000
  214.                                                                         02140000
  215. /*  what's the real name of the file?  */                               02150000
  216. Parse Value gopclifi(path) With fn ft .                                 02160000
  217. Push "COMMAND SET FNAME" fn                                             02170000
  218. Push "COMMAND SET FTYPE" ft                                             02180000
  219. Push "COMMAND SET FMODE A1"                                             02190000
  220.                                                                         02200000
  221. /*  now invoke XEDIT  */                                                02210000
  222. 'CALLPIPE COMMAND STATE GOPXEDPR XEDIT *'                               02220000
  223. If rc = 0 Then Address "COMMAND" ,                                      02230000
  224.                 'XEDIT VMGOPHER DOCUMENT A (PROFILE GOPXEDPR'           02240000
  225.           Else Address "COMMAND" ,                                      02250000
  226.                 'XEDIT VMGOPHER DOCUMENT A'                             02260000
  227.                                                                         02270000
  228. Return                                                                  02280000
  229.                                                                         02290000
  230.                                                                         02300000
  231.                                                                         02310000
  232. /* ============================================================== BROWSE02320000
  233.  *  Take the "file" from the input stream and pass it to CMS BROWSE.    02330000
  234.  */                                                                     02340000
  235. BROWSE:                                                                 02350000
  236.                                                                         02360000
  237. If fs.tube ^= "" Then Do                                                02370000
  238.     /*  "Can't run BROWSE on this terminal."  */                        02380000
  239.     'CALLPIPE COMMAND XMITMSG 512 "BROWSE"' ,                           02390000
  240.             '(APPLID GOP CALLER FVW ERRMSG | STEM MESSAGE. APPEND'      02400000
  241.     Return                                                              02410000
  242.     End /* If .. Do */                                                  02420000
  243.                                                                         02430000
  244. Parse Value gopclifi(path) With fn ft .                                 02440000
  245. filespec = fn ft 'A'                                                    02450000
  246.                                                                         02460000
  247. 'CALLPIPE CMS STATE' filespec '| STEM MESSAGE.'                         02470000
  248. If  rc ^= 0 & rc ^= 28 & rc ^= 20  Then Return                          02480000
  249. If  rc = 0 | rc = 20  Then Do                                           02490000
  250.     fn = "VMGOPHER"                                                     02500000
  251.     ft = "DOCUMENT"                                                     02510000
  252.     End  /*  If  ..  Do  */                                             02520000
  253. message.0 = 0                                                           02530000
  254.                                                                         02540000
  255. /*  stash this in a temporary file  */                                  02550000
  256. 'CALLPIPE *: | >' fn ft 'A3'                                            02560000
  257.                                                                         02570000
  258. /* stash this in a temporary file and invoke BROWSE */                  02580000
  259. Address "COMMAND" 'BROWSE' filespec                                     02590000
  260.                                                                         02600000
  261. Return                                                                  02610000
  262.                                                                         02620000
  263.                                                                         02630000
  264.                                                                         02640000
  265. /* ============================================================ ANYOTHER02650000
  266.  *  View the file with some unknown text editor or file browser.        02660000
  267.  */                                                                     02670000
  268. ANYOTHER:                                                               02680000
  269.                                                                         02690000
  270. If fs.tube ^= "" Then Do                                                02700000
  271.     /*  "Can't run" viewer "on this terminal."  */                      02710000
  272.     'CALLPIPE COMMAND XMITMSG 512 VIEWER' ,                             02720000
  273.             '(APPLID GOP CALLER FVW ERRMSG | STEM MESSAGE. APPEND'      02730000
  274.     Return                                                              02740000
  275.     End /* If .. Do */                                                  02750000
  276.                                                                         02760000
  277. Parse Value gopclifi(path) With fn ft .                                 02770000
  278. filespec = fn ft 'A'                                                    02780000
  279.                                                                         02790000
  280. 'CALLPIPE CMS STATE' filespec '| STEM MESSAGE.'                         02800000
  281. If  rc ^= 0 & rc ^= 28 & rc ^= 20  Then Return                          02810000
  282. If  rc = 0 | rc = 20  Then Do                                           02820000
  283.     fn = "VMGOPHER"                                                     02830000
  284.     ft = "DOCUMENT"                                                     02840000
  285.     End  /*  If  ..  Do  */                                             02850000
  286. message.0 = 0                                                           02860000
  287.                                                                         02870000
  288. /*  stash this in a temporary file  */                                  02880000
  289. 'CALLPIPE *: | >' fn ft 'A3'                                            02890000
  290.                                                                         02900000
  291. /* stash this in a temporary file and invoke the viewer  */             02910000
  292. 'CALLPIPE CMS' viewer filespec '| CONSOLE'                              02920000
  293.                                                                         02930000
  294. Return                                                                  02940000
  295.                                                                         02950000
  296.                                                                         02960000
  297.                                                                         02970000
  298. /* ---------------------------------------------------------------- HELP02980000
  299.  * Invoke CMS HELP passing any supplied argument (context sensitive).   02990000
  300.  */                                                                     03000000
  301. HELP:     Procedure Expose fs. message.                                 03010000
  302.                                                                         03020000
  303. If fs.tube ^= "" Then                                                   03030000
  304.     'CALLPIPE COMMAND HELP GOPHER VIEWER (ALL' ,                        03040000
  305.         '| GOPCLIFV VIEWER HELP' ,                                      03050000
  306.             '| STEM MESSAGE. APPEND'                                    03060000
  307.                                                                         03070000
  308. Else Do                                                                 03080000
  309.     'CALLPIPE COMMAND HELP GOPHER VIEWER'                               03090000
  310.     Address "COMLAND" 'VMFCLEAR'                                        03100000
  311.     End  /*  Else  Do  */                                               03110000
  312.                                                                         03120000
  313. Return                                                                  03130000
  314.                                                                         03140000
  315.                                                                         03150000
  316.                                                                         03160000
  317. /* ------------------------------------------------------------ SUBXEDIT03170000
  318.  *  Take the file in storage and pass it to CMS XEDIT.                  03180000
  319.  */                                                                     03190000
  320. SUBXEDIT:                                                               03200000
  321.                                                                         03210000
  322. If fs.tube ^= "" Then Do                                                03220000
  323.     /*  "Can't run XEDIT on this terminal."  */                         03230000
  324.     'CALLPIPE COMMAND XMITMSG 512 "XEDIT"' ,                            03240000
  325.             '(APPLID GOP CALLER FVW ERRMSG | STEM MESSAGE. APPEND'      03250000
  326.     Return                                                              03260000
  327.     End /* If .. Do */                                                  03270000
  328.                                                                         03280000
  329. /*  stash this in a temporary file  */                                  03290000
  330. 'CALLPIPE STEM FILE. | > VMGOPHER DOCUMENT A3'                          03300000
  331.                                                                         03310000
  332. /*  what's the real name of the file?  */                               03320000
  333. Parse Value gopclifi(path) With fn ft .                                 03330000
  334. Push "COMMAND SET FNAME" fn                                             03340000
  335. Push "COMMAND SET FTYPE" ft                                             03350000
  336. Push "COMMAND SET FMODE A1"                                             03360000
  337.                                                                         03370000
  338. /*  now invoke XEDIT  */                                                03380000
  339. 'CALLPIPE COMMAND STATE GOPXEDPR XEDIT *'                               03390000
  340. If rc = 0 Then Address "COMMAND" ,                                      03400000
  341.                 'XEDIT VMGOPHER DOCUMENT A (PROFILE GOPXEDPR'           03410000
  342.           Else Address "COMMAND" ,                                      03420000
  343.                 'XEDIT VMGOPHER DOCUMENT A'                             03430000
  344.                                                                         03440000
  345. Return                                                                  03450000
  346.                                                                         03460000
  347.                                                                         03470000
  348.                                                                         03480000
  349. /* --------------------------------------------------------------- PRINT03490000
  350.  *  Take the current "file" in context and send it to the user's        03500000
  351.  *  virtual printer.  Printer may be SPOOLed CONTinuous.                03510000
  352.  */                                                                     03520000
  353. PRINT:                                                                  03530000
  354.                                                                         03540000
  355. If fs.tube ^= "" Then Do                                                03550000
  356.     /*  "Can't PRINT from this terminal."  */                           03560000
  357.     'CALLPIPE COMMAND XMITMSG 507 (APPLID GOP CALLER FVW ERRMSG' ,      03570000
  358.             '| STEM MESSAGE. APPEND'                                    03580000
  359.     Return                                                              03590000
  360.     End /* If .. Do */                                                  03600000
  361.                                                                         03610000
  362. 'CALLPIPE STEM FILE. | PRINT (TITLE' name '| STEM MESSAGE. APPEND'      03620000
  363.                                                                         03630000
  364. Return                                                                  03640000
  365.                                                                         03650000
  366.                                                                         03660000
  367.                                                                         03670000
  368. /* ---------------------------------------------------------------- SAVE03680000
  369.  * Save the current file being viewed to the user's A disk.             03690000
  370.  */                                                                     03700000
  371. SAVE:                                                                   03710000
  372.                                                                         03720000
  373. If fs.tube ^= "" Then Do                                                03730000
  374.     Call MESSAGE "Can't SAVE files via this terminal."                  03740000
  375.     Return                                                              03750000
  376.     End /* If .. Do */                                                  03760000
  377.                                                                         03770000
  378. Parse Value gopclifi(path) With fn ft .                                 03780000
  379. filespec = fn ft 'A'                                                    03790000
  380.                                                                         03800000
  381. 'CALLPIPE CMS STATE' filespec '| STEM MESSAGE.'                         03810000
  382. If rc = 0 Then Do                                                       03820000
  383.     'CALLPIPE COMMAND XMITMSG 24 FILESPEC' ,                            03830000
  384.         '| SPLIT AT /;/ | TAKE | STEM MESSAGE.'                         03840000
  385.     Return                                                              03850000
  386.     End  /*  If  ..  Do  */                                             03860000
  387. If rc ^= 28 Then Return                                                 03870000
  388. message.0 = 0                                                           03880000
  389.                                                                         03890000
  390. 'CALLPIPE STEM FILE. | >' filespec                                      03900000
  391. If rc = 0 Then Do                                                       03910000
  392.     /*  Creating new file:  */                                          03920000
  393.     'CALLPIPE COMMAND XMITMSG 571 | STEM MESSAGE. APPEND'               03930000
  394.     message.1 = message.1 filespec                                      03940000
  395. /*  Call message "Created" filespec "from" path  */                     03950000
  396.     End  /*  If  ..  Do  */                                             03960000
  397.                                                                         03970000
  398. Return                                                                  03980000
  399.                                                                         03990000
  400.                                                                         04000000
  401.                                                                         04010000
  402. /* ---------------------------------------------------------------- FIND04020000
  403.  *  Find a particular string within the file being viewed.              04030000
  404.  */                                                                     04040000
  405. FIND:                                                                   04050000
  406.                                                                         04060000
  407. 'CALLPIPE COMMAND XMITMSG 602 "' || needle || '" (APPLID GOP' ,         04070000
  408.         'CALLER MNU NOHEADER | GOPCLIUI | VAR NEEDLE'                   04080000
  409. needle = Translate(Strip(needle))                                       04090000
  410. If needle = "" Then Return                                              04100000
  411.                                                                         04110000
  412. Do i = ko + 1 to ki                                                     04120000
  413.     If Index(Translate(file.i),needle) > 0 Then Do                      04130000
  414.         ko = i                                                          04140000
  415.         Return                                                          04150000
  416.         End  /*  If  ..  Do  */                                         04160000
  417.     End  /*  Do  For  */                                                04170000
  418.                                                                         04180000
  419. /*  'CALLPIPE COMMAND XMITMSG 546 (ERRMSG'  CALLER DMS is OK  */        04190000
  420. /*  "Target not found"  */                                              04200000
  421. 'CALLPIPE COMMAND XMITMSG 546 (APPLID GOP CALLER MNU ERRMSG' ,          04210000
  422.         '| STEM MESSAGE. APPEND'                                        04220000
  423.                                                                         04230000
  424. Return                                                                  04240000
  425.                                                                         04250000
  426.                                                                         04260000
  427.                                                                         04270000
  428.                                                                         04280000
  429. /* ---------------------------------------------------------------- MARK04290000
  430.  *  Save a book mark referencing this file.                             04300000
  431.  */                                                                     04310000
  432. MARK:                                                                   04320000
  433.                                                                         04330000
  434. If fs.tube ^= "" Then Do                                                04340000
  435.     /*  "Can't set bookmarks from this screen."  */                     04350000
  436.     'CALLPIPE COMMAND XMITMSG 43 (APPLID GOP CALLER FVW ERRMSG' ,       04360000
  437.             '| STEM MESSAGE. APPEND'                                    04370000
  438.     Return                                                              04380000
  439.     End /* If .. Do */                                                  04390000
  440.                                                                         04400000
  441. Address "COMMAND" 'GLOBALV SELECT GOPHER GET BOOKMARK.0'                04410000
  442. If ^Datatype(bookmark.0,'N') Then bookmark.0 = 0                        04420000
  443. i = bookmark.0 + 1                                                      04430000
  444. bookmark.i = item                                                       04440000
  445. Address "COMMAND" 'GLOBALV SELECT GOPHER PUTP BOOKMARK.' || i           04450000
  446. bookmark.0 = i                                                          04460000
  447. Address "COMMAND" 'GLOBALV SELECT GOPHER PUTP BOOKMARK.0'               04470000
  448.                                                                         04480000
  449. If rc = 0 Then 'CALLPIPE COMMAND XMITMSG 41 I' ,                        04490000
  450.     '(APPLID GOP CALLER FVW ERRMSG | STEM MESSAGE. APPEND'              04500000
  451.     /*  "Bookmark" i "saved."  */                                       04510000
  452.           Else 'CALLPIPE COMMAND XMITMSG 514 RC "GLOBALV"' ,            04520000
  453.         '(APPLID GOP CALLER FVW ERRMSG | STEM MESSAGE. APPEND'          04530000
  454.                                                                         04540000
  455. Return                                                                  04550000
  456.                                                                         04560000
  457.                                                                         04570000
  458.                                                                         04580000
  459. /* ------------------------------------------------------------ BOOKLIST04590000
  460.  *  Call GOPCLI to show the lit of bookmarks.                           04600000
  461.  */                                                                     04610000
  462. BOOKLIST:                                                               04620000
  463.                                                                         04630000
  464. Address "CMS" 'GOPCLI (BOOKLIST'                                        04640000
  465.                                                                         04650000
  466. Return                                                                  04660000
  467.                                                                         04670000
  468.                                                                         04680000
  469.                                                                         04690000
  470. /* ----------------------------------------------------------------- FIX04700000
  471.  * Takes an inbound 3270 DS screen address (two bytes)                  04710000
  472.  * and returns the equivalent byte offset in decimal.                   04720000
  473.  */                                                                     04730000
  474. FIX:                                                                    04740000
  475. Parse Arg o,.                                                           04750000
  476. Parse Var o 1 o1 2 o2 3 .                                               04760000
  477. o1 = c2d(o1)                                                            04770000
  478. o2 = c2d(o2)                                                            04780000
  479. If o1 < 64 Then Return o1 * 256 + o2                                    04790000
  480.            Else Return (o1 // 64) * 64 + (o2 // 64)                     04800000
  481.                                                                         04810000
  482.                                                                         04820000
  483.                                                                         04830000
  484. /* ---------------------------------------------------------- WRITE_READ04840000
  485.  * Display what we have, then wait for user input and return it.        04850000
  486.  */                                                                     04860000
  487. WRITE_READ: Procedure Expose fs.                                        04870000
  488. Parse Arg ws,wcc,wrt,.                                                  04880000
  489. If wcc = "" Then wcc = 'C3'x                                            04890000
  490. /*  If wrt = "" Then wrt = 'C0'x  */                                    04900000
  491. If wrt = "" Then wrt = fs.write                                         04910000
  492. ws = wrt || wcc || ws                                                   04920000
  493. 'CALLPIPE VAR WS | FULLSCR' fs.tube '| VAR RS'                          04930000
  494. If rc ^= 0 Then rs = '000000'x                                          04940000
  495. Return rs                                                               04950000
  496.                                                                         04960000
  497.                                                                         04970000
  498.                                                                         04980000
  499. /* ----------------------------------------------------------------- SBA04990000
  500.  * (a better SBA function extracted from PIPEDEMO; thanks, Chuck!)      05000000
  501.  * Construct Set Buffer Address order from row and column.              05010000
  502.  */                                                                     05020000
  503.                                                                         05030000
  504. SBA:      Procedure Expose fs.                                          05040000
  505.                                                                         05050000
  506. arg row , col, .                                                        05060000
  507. row = Trunc(row)                                                        05070000
  508. col = Trunc(col)                                                        05080000
  509.                                                                         05090000
  510. /*-----------------------------------------------------------------*/   05100000
  511. /* Calculate binary address.                                       */   05110000
  512. /*-----------------------------------------------------------------*/   05120000
  513.                                                                         05130000
  514. offset = row * fs.scrcols + col                                         05140000
  515. Do While offset < 0; offset = offset + fs.scrrows * fs.scrcols; End     05150000
  516.                                                                         05160000
  517. if fs.14bit then return '11'x || d2c(offset,2)                          05170000
  518.                                                                         05180000
  519. /*-----------------------------------------------------------------*/   05190000
  520. /* Convert to six-bit format. (xxxx111111111111 -> 0011111100111111*/   05200000
  521. /*-----------------------------------------------------------------*/   05210000
  522.                                                                         05220000
  523. 'CALLPIPE var offset'               ,   /* Start with char number.    */05230000
  524.     '| spec 1-* d2c 1.2 right'      ,   /* Convert to binary.         */05240000
  525.     '| spec 1-* c2b 1'              ,   /* Convert to bit string.     */05250000
  526.     '| spec /00/ 1  5.6  3'         ,   /* Place first six bits.      */05260000
  527.            '/00/ 9 11.6 11'         ,   /* Place second six bits.     */05270000
  528.     '| spec 1-* b2c 1'              ,   /* Convert back to binary.    */05280000
  529.     '| xlate *-* 00-3F 40-7F'       ,   /* Translate to coded         */05290000
  530.                 '01-09 C1-C9'       ,   /*   buffer address.          */05300000
  531.                 '11-19 D1-D9'       ,   /*                            */05310000
  532.                 '22-29 E2-E9'       ,   /*                            */05320000
  533.                 '30-39 F0-F9'       ,   /*                            */05330000
  534.     '| spec x11 1 1.2 2'            ,   /* Prefix with SBA order.     */05340000
  535.     '| var offset'                      /* Put back in variable.      */05350000
  536.                                                                         05360000
  537. Return offset                                                           05370000
  538.                                                                         05380000
  539.                                                                         05390000
  540.                                                                         05400000
  541. /* --------------------------------------------------------------- FIELD05410000
  542.  * Generate the 3270 DS sequence for extended field attributes          05420000
  543.  * (if available).                                                      05430000
  544.  */                                                                     05440000
  545. FIELD:    Procedure Expose fs.                                          05450000
  546. a = '00'x                                                               05460000
  547. b = '00'x                                                               05470000
  548. c = 'F1'x                                                               05480000
  549. i = 1                                                                   05490000
  550. Do While Arg(i) ^= ""                                                   05500000
  551.     Select  /*  at  */                                                  05510000
  552.         When Abbrev("PROTECTED",Arg(i),2)   Then a = bitor(a,'20'x)     05520000
  553.         When Abbrev("SKIP",Arg(i),1)        Then a = bitor(a,'10'x)     05530000
  554.         When Abbrev("NODISPLAY",Arg(i),1)   Then a = bitor(a,'0C'x)     05540000
  555.         When Abbrev("HIGH",Arg(i),1)        Then a = bitor(a,'08'x)     05550000
  556.         When Abbrev("BLINK",Arg(i),3)       Then b = bitor(b,'01'x)     05560000
  557.         When Abbrev("REVERSE",Arg(i),3)     Then b = bitor(b,'02'x)     05570000
  558.         When Abbrev("UNDERLINE",Arg(i),1)   Then b = bitor(b,'04'x)     05580000
  559.         When Abbrev("BLUE",Arg(i),3)        Then c = 'F1'x              05590000
  560.         When Abbrev("RED",Arg(i),3)         Then c = 'F2'x              05600000
  561.         When Abbrev("PINK",Arg(i),1)        Then c = 'F3'x              05610000
  562.         When Abbrev("GREEN",Arg(i),1)       Then c = 'F4'x              05620000
  563.         When Abbrev("TURQUOISE",Arg(i),1)   Then c = 'F5'x              05630000
  564.         When Abbrev("YELLOW",Arg(i),1)      Then c = 'F6'x              05640000
  565.         When Abbrev("WHITE",Arg(i),1)       Then c = 'F7'x              05650000
  566.         Otherwise nop                                                   05660000
  567.         End  /*  Select  at  */                                         05670000
  568.     i = i + 1                                                           05680000
  569.     End  /*  Do  While  */                                              05690000
  570.                                                                         05700000
  571. If  ^fs.color   | ,                                                     05710000
  572.     ^fs.exthi   Then    Return '1D'x || bitor(a,'40'x)                  05720000
  573.                 Else    Return '2902'x || ,                             05730000
  574.                                'C0'x   || bitor(a,'40'x) || ,           05740000
  575.                                '42'x   || bitor(c,'40'x)                05750000
  576.                                                                         05760000
  577.